package ma.myschool.app.dao.hibernate;

import java.util.List;

import ma.myschool.app.dao.PaiementDao;
import ma.myschool.app.model.AnneeScolaire;
import ma.myschool.app.model.MoisPaye;
import ma.myschool.app.model.Paiement;

import org.springframework.stereotype.Repository;


/**
 * This class interacts with hibernate session to save/delete and
 * retrieve Role objects.
 *
 * @author <a href="mailto:bwnoll@gmail.com">Bryan Noll</a>
 * @author jgarcia (updated to hibernate 4)
 */
@Repository
public class PaiementDaoHibernate extends GenericDaoHibernate<Paiement, Long> implements PaiementDao {

    /**
     * Constructor to create a Generics-based version using Role as the entity
     */
    public PaiementDaoHibernate() {
        super(Paiement.class);
    }

	@Override
	public List<Paiement> loadPaiementsByEleve(Long idEleve, AnneeScolaire anneeScolaire) {
		return getSession().createQuery("FROM Paiement p WHERE p.eleve.id=" + idEleve + " AND p.anneeScolaire.id=" + anneeScolaire.getId()).list();
	}

	@Override
	public List<Paiement> loadPaiementsWithResteByEleve(Long id) {
		return getSession().createQuery("FROM Paiement p WHERE p.reste > 0 AND p.eleve.id=" + id).list();
	}

	@Override
	public Number sumAvancePaiements(AnneeScolaire anneeScolaire) {
		Number n = (Number) getSession().createQuery("SELECT sum(p.avance) FROM Paiement p WHERE p.anneeScolaire.id=" + anneeScolaire.getId()).uniqueResult();
		if(n == null)
			n = 0;
		
		return n;
		
	}

	@Override
	public Number sumAvancePaimentParMois(MoisPaye moisPaye, AnneeScolaire anneeScolaire) {
		Number n = (Number) getSession().createQuery("SELECT sum(p.avance) FROM Paiement p"
				+ " WHERE p.anneeScolaire.id=" + anneeScolaire.getId()
				+ " AND p.moisPaye.id=" + moisPaye.getId()).uniqueResult();
		if(n == null)
			n = 0;
		
		return n;
	}

	@Override
	public Number sumRestePaimentParMois(MoisPaye moisPaye,
			AnneeScolaire anneeScolaire) {
		Number n = (Number) getSession().createQuery("SELECT sum(p.reste) FROM Paiement p"
				+ " WHERE p.anneeScolaire.id=" + anneeScolaire.getId()
				+ " AND p.moisPaye.id=" + moisPaye.getId()).uniqueResult();
		if(n == null)
			n = 0;
		
		return n;
	}

	@Override
	public Number sumAllPaiementsPrevu() {
		Number npm = (Number) getSession().createQuery("SELECT sum(e.paiementMensuel) FROM Eleve e WHERE e.deleted=false AND e.exonere=false").uniqueResult(); 
		Number npt = (Number) getSession().createQuery("SELECT sum(e.paiementTransport) FROM Eleve e WHERE e.deleted=false AND e.exonere=false").uniqueResult();
		if(npm == null)
			npm = 0;
		if(npt == null)
			npt = 0;
		Number result = npm.doubleValue() + npt.doubleValue();
		
		return result;
	}

	@Override
	public Number sumAllRestePaiement(AnneeScolaire anneeScolaire) {
		Number n = (Number) getSession().createQuery("SELECT sum(p.reste) FROM Paiement p WHERE p.anneeScolaire.id=" + anneeScolaire.getId()).uniqueResult();
		if(n == null)
			n = 0;
		
		return n;
	}
}
